package port

import (
	"strings"
	"time"
)

// PortChecker 端口检测参数结构体
// Timeout: 超时时间（秒）
// Count: 检测次数
// Protocol: 协议（tcp/udp）
type PortChecker struct {
	Timeout  int    // 超时时间
	Count    int    // 检测次数
	Protocol string // "tcp" 或 "udp"
}

// NewPortChecker 创建并初始化一个 PortChecker 实例
//
// 参数：
//
//	protocol: 协议类型，支持 "tcp" 或 "udp"，不区分大小写，内部会自动转换为小写
//	count: 检测次数，<=0 时默认4次
//	timeout: 超时时间（秒），<=0 时默认5秒
//
// 返回：
//
//	*PortChecker 端口检测器实例
func NewPortChecker(protocol string, count, timeout int) *PortChecker {
	if timeout <= 0 {
		timeout = 5
	}
	if count <= 0 {
		count = 4
	}
	protocol = strings.ToLower(protocol)
	return &PortChecker{
		Protocol: protocol,
		Count:    count,
		Timeout:  timeout,
	}
}

// PortCheckResult 端口检测结果结构体
// Host: 目标主机
// Port: 目标端口
// Sent: 检测次数
// Success: 成功次数
// Failed: 失败次数
// MinDelay, MaxDelay, AvgDelay: 延迟统计
// Delays: 每次检测的延迟
// Speed: 速率（字节/秒，UDP可用）
type PortCheckResult struct {
	Host     string
	Port     int
	Sent     int
	Success  int
	Failed   int
	MinDelay time.Duration
	MaxDelay time.Duration
	AvgDelay time.Duration
	Delays   []time.Duration
	Speed    float64 // 速率，单位字节/秒
}

// CalculateStats 计算延迟统计信息
func (r *PortCheckResult) CalculateStats() {
	if len(r.Delays) == 0 {
		return
	}
	r.MinDelay = r.Delays[0]
	r.MaxDelay = r.Delays[0]
	var total time.Duration
	for _, d := range r.Delays {
		if d < r.MinDelay {
			r.MinDelay = d
		}
		if d > r.MaxDelay {
			r.MaxDelay = d
		}
		total += d
	}
	r.AvgDelay = total / time.Duration(len(r.Delays))
}
